#include <stdlib.h>
#include <math.h>

#include "buffer.h"

#ifndef COMPRESORESTRUCTURADO_H_
#define COMPRESORESTRUCTURADO_H_

#define FRECUENCIAS_TOTALES 274
#define BITS 				16
#define TOPE 				65535 //2^Bits-1
#define UN_CUARTO 			(TOPE/4 +1)
#define MITAD 				(2*UN_CUARTO)
#define TRES_CUARTOS 		(3*UN_CUARTO)
#define FIN_DE_ARCHIVO 		256
#define CANTIDAD_DE_NIVELES 9

int posicionDelUltimoElementoDelNivel (int nivel);
int ultimoElementoDelNivel (int nivel);
int obtenerSumaFrecuencias(int valor,int* frecuencias);
int sumatoriaDeFrecuencias(int register*vector,int inicio, int veces);
int* crearEstadisticaModeloEstructurado ();
void renormalizacionParaComprimir (int *piso, int *techo, buffer* buffer);
void actualizarModelo(int nivel,int posicionDelNumeroEnVectorDeEstadisticas,int* pisoDelIntervalo,int* techoDelIntervalo,int* vectorDeFrecuencias);
void comprimir (int* salidaMTF,int tamanioSalidaMTF,int* vectorDeFrecuencias,buffer* buffer);
int determinarFrecuenciasAcumuladas(int valor,int nivel,int* vectorDeFrecuencias,int piso,int techo,int* pisoFrecuenciaAcumulada,int* techoFrecuenciaAcumulada);
void renormalizacionParaDescomprimir(int* valor,int* piso, int* techo,buffer* buffer);
int* descomprimir (int* vectorDeFrecuencias, buffer* buffer);
void comprimir (int* salidaMTF,int tamanioSalidaMTF,int* vectorDeEstadistica,buffer* buffer);
int determinarFrecuenciasAcumuladas(int valor,int nivel,int* vectorDeEstadistica,int piso,int techo,
		int* pisoFrecuenciaAcumulada,int* techoFrecuenciaAcumulada);
void renormalizacionDeKarloParaDescomprimir(int* valor,int* piso, int* techo,buffer* buffer);
int* descomprimir (int* vectorDeEstadistica, buffer* buffer);

#endif /* COMPRESORESTRUCTURADO_H_ */
